﻿using System;
using CI;
using CI.Utils;

namespace iRobotController
{
    /// <summary>
    /// Handle the fault tolerence before we shutdown the hardware in case its in a unappropiate state.
    /// </summary>
    public class HWFaultTolerence
    {
        private DateTime _lastFaultTime;
        private readonly TimeSpan _faultTimeTolerence;
        private readonly TimeSpan _faultTimeTolerenceReset;
        private readonly SimEnv _simEnv = SimEnv.Instance;

        public HWFaultTolerence(TimeSpan faultTimeTolerence, TimeSpan faultTimeTolerenceReset)
        {
            if (faultTimeTolerenceReset.CompareTo(faultTimeTolerence) < 0)
                throw new ArgumentException("FaultTimeTolerence must be less then FaultTimeTolerenceRest");
            _faultTimeTolerence = faultTimeTolerence;
            _faultTimeTolerenceReset = faultTimeTolerenceReset;
            _lastFaultTime = new DateTime();
        }

        public bool HasFaultTolerenceThresholdBeenReached(DateTime time)
        {
            if (time.CompareTo(_lastFaultTime.Add(_faultTimeTolerenceReset)) > 0)
            {
                _lastFaultTime = time;
                _simEnv.TraceLogger.LogWarn("Saving new last fault time to : " + _lastFaultTime.TimeOfDay);
                return false;
            }

            if (time.CompareTo(_lastFaultTime.Add(_faultTimeTolerence)) < 0)
            {
                _simEnv.TraceLogger.LogWarn(string.Format("Time {0} is below threshold {1} from orig fault time {2}", (time - _lastFaultTime), _faultTimeTolerence, _lastFaultTime.TimeOfDay));
                return false;
            }

            if (time.CompareTo(_lastFaultTime.Add(_faultTimeTolerence)) > 0)
            {
                _simEnv.TraceLogger.LogWarn(string.Format("Time {0} is above threshold {1} from orig fault time {2}", (time - _lastFaultTime), _faultTimeTolerence, _lastFaultTime.TimeOfDay));
                return true;
            }

            return false;
        }
    }
}
